package it.univpm.diiga.memorysim.kernel;

import it.univpm.diiga.memorysim.kernel.shared.FileCtrlBlock;
import it.univpm.diiga.memorysim.kernel.shared.FileRequest;
import it.univpm.diiga.memorysim.kernel.shared.Parameters;

public class AllocatorFileManager {
	FileRequest file;
	FileCtrlBlock fcb=null;
	
	
	public AllocatorFileManager(FileRequest file){
		this.file=file;
	}
	
	
	
	////preleva FilectrlBlock (in fase di creazione e r/w)
	public void Start(){
		
		AllocatorFile af=new AllocatorFile(file);	
		switch(file.getTipoOperazione())
		{
			case 0://read  preleva filecontrolblock dall hd e lo inserisce nella tab file aperti
			{
				fcb=af.getfcb();
				
				if (fcb!= null){ //solo se il file esiste gia
					Parameters.setRowOpenTable(fcb);
					System.out.println("OPERAZIONE RICHIESTA: LETTURA "+file.getName());
				}
			break;					
			}
			case 1:///write preleva filecontrolblock dall hd e lo inserisce nella tab file aperti
			{
				fcb=Parameters.getRowOpenTable(file.getId());
				
				System.out.println("OPERAZIONE RICHIESTA: MODIFICA "+file.getName());
				

				long sizeFile=((fcb.getFileBlocks().size())*Parameters.getBlockSizeHDD());		//dimensione del file in esamine nell'operazione di modifica
				
				if ((file.getDim()<0) && (Math.abs(file.getDim())>=sizeFile))
					System.out.println("Attention,you are trying to reduce the file size to a size less than zero. The operation can't be terminate.");
				else{			
					//Ora bisogna modificare la dimensione del file in memoria in base alla dim della richiesta
					af.write();
				}
				
				
				

			break;	
			}
			
			case 2:///create crea file sull hd 
			{
				System.out.println("OPERAZIONE RICHIESTA: CREAZIONE "+file.getName());
				af.createfcb();
				//fcb=af.getfcb();
				break;
			}
			case 3:///delete cancella file dall hd
			{
				System.out.println("OPERAZIONE RICHIESTA: CANCELLAZIONE "+file.getName());
				af.deleteFile();
				break;
			}
			case 4:///chiusura cancellafilectrlblock da tabfileaperti
			{
				System.out.println("OPERAZIONE RICHIESTA: CANCELLAZIONE FCB DALLA TAB DEI FILE APERTI PER "+file.getName());
				Parameters.delRowOpenTable(file.getId());
				break;
			}
			
		
		}
			
		
	}
	
	////
	
	
	
	
}
